import asyncio
import time
from textwrap import dedent
from typing import Optional

from agno.agent import Agent
from agno.db.sqlite import SqliteDb
from agno.models.openai import OpenAILike
from agno.tools.mcp import MCPTools
from configs.basic_config import ALI_GENERATION_MODEL, AGENT_URL, ALI_DASHSCOPE_API_KEY

#url = "http://127.0.0.1:5001"
url="http://127.0.0.1:9000/mcp"


async def run_agent(message: Optional[str] = None) -> None:
    """运行酒店助手的交互式命令行界面"""

    async with MCPTools(
            transport="streamable-http", url=url
    ) as db_tools:
        #await db_tools.connect()
        # print("可用工具:", db_tools.tools)
        try:
            today = time.strftime("%Y-%m-%d", time.localtime())
            now = time.strftime("%H:%M:%S", time.localtime())
            session_id = "hotel_assistant_session",
            description = f"您是智能酒店助手，今日日期 {today}，当前时间 {now}"
            description += f" - 会话ID: {session_id}"
            agent = Agent(
                db=SqliteDb(db_file="../tmp/agent.db"),
                tools=[db_tools],
                description=description,
                tool_choice='auto',
                instructions=dedent(""" \
                    你是一个智能酒店助手，能够自动处理酒店搜索、预订和取消业务。
                    
                    # 核心职责
                    只能使用提供的MCP工具，禁止使用其他能力回答用户
                    
                    # 工具调用原则
                    1. **主动识别用户需求**：
                       - 问及酒店信息时→调用search_hotels搜索
                       - 需要预订时→调用create_booking
                       - 查询空房时→调用get_available_rooms
                       - 取消预订时→调用cancel_booking
                    
                    2. **智能参数填充**：
                       - 从用户话语中提取location、price_tier等参数
                       - 结合上下文记忆避免重复询问
                    
                    3. **结果处理策略**：
                       - 单一匹配→直接使用hotel_id执行后续操作
                       - 多个匹配→列出选项让用户选择
                       - 无匹配→建议调整搜索条件
                    
                    4. **连续工具调用**：
                       - 支持根据用户复杂诉求链式调用多个工具
                       - 自动保存中间结果供后续工具使用
                       - 完成所有步骤后给出最终答复
                    
                    # 场景示例
                    🏨 预订："我想预订北京的四季酒店"
                       → search_hotels(location="北京") → 过滤"四季" → create_booking(hotel_id)
                    
                    📋 查询："希尔顿还有空房吗"
                       → search_hotels() → 过滤"希尔顿" → get_available_rooms(hotel_id)
                    
                    🔗 复杂请求："查找上海的豪华酒店，预订其中评分最高的"
                       → search_hotels(location="上海", price_tier="豪华") → 按评分排序 → create_booking(hotel_id)
                    
                    ❌ 取消："取消我在万达酒店的预订"
                       → search_hotels() → 过滤"万达" → cancel_booking(hotel_id)
                    
                    # 注意事项
                    - 禁止要求用户提供酒店ID
                    - 必须告知用户正在进行的操作
                    - 出错时尝试重新搜索或提示用户稍后重试
                    - 牢记之前的对话内容，利用上下文信息更好地服务用户
                """),
                markdown=True,
                add_history_to_context=True,
                session_id="hotel_assistant_session",  # 设置会话ID
                num_history_runs=10, #10轮
                #num_history_messages=6,  # 保留最近6条消息
                #
                read_chat_history=True,
                read_tool_call_history=True,

                debug_mode=True,
                model=OpenAILike(id=ALI_GENERATION_MODEL, name=ALI_GENERATION_MODEL, api_key=ALI_DASHSCOPE_API_KEY,
                                 base_url=AGENT_URL),
            )

            print("🏨 智能酒店助手已启动！")
            print("例如：")
            print("   - '预订北京的四季酒店'")
            print("   - '上海有什么豪华酒店？'")
            print("   - '取消我在希尔顿的订单'")
            print("-" * 50)

            await agent.acli_app(message=message, stream=True)
        finally:
            print("call end")

if __name__ == "__main__":
    asyncio.run(run_agent(message=None))
    # 上海有什么豪华酒店？
    # 北京呢   （可以上下文了）
    # 帮我预定四季酒店，明天晚上入住后天离开。